package com.etime.shycourse.services.interfaces;

import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.etime.shycourse.dto.CourseAndCourseTypeDto;
import com.etime.shycourse.dto.CourseOfflineDto;
import com.etime.shycourse.dto.CourseOfflineshowattrconfigDto;
import com.etime.shycourse.pojo.Course;
import com.etime.shycourse.pojo.Teacher;

import java.util.List;

/**
 * <p>
 * 课程服务类
 * </p>
 *
 * @author wb
 * @since 2021-12-17
 */
public interface CourseServices {

    /**
     * 根据courseid 查询一条课程数据
     */
    Course selectCourseById(Integer courseid);

    /**
     * 根据courseid 查询一条课程+课程类型数据(详细)
     */
    CourseAndCourseTypeDto selectCourseAndCourseTypeById(Integer courseid);

    /**
     * 根据教师id，从课程表中查询出该教师所有的课程列表
     *
     * @param teacherId 教师id
     * @return List<Course>
     */
    List<Course> selectCourseTeacherById(Integer teacherId);


    /**
     * 查询 从本机构中查询本机构所有在职老师
     *
     * @param orgId 机构id
     * @return List<Course>
     */
    List<Teacher> selectCourseTeacherByOrgId(Integer orgId);

    /**
     * 根据 课程courseid
     * 修改课表中的：课程教师id和课程教师姓名两个字段
     * <p>
     * 复用 +修改Course使用数据
     *
     * @param course 必要条件中的课程id（courseid）
     * @return int
     */
    int updateCourse(Course course);

    /**
     * 修改教师表：教师所属机构id=-2。变更为独立教师身份。
     * 根据教师表 中的教师id
     **/
    int upDataTeacher(Teacher teacher);

    /**
     * 教师只能查询自己的课程；
     * 课程（course）中，根据条件：课程教师id（courseteacherid）= 登录用户的教师id，进行查询。
     *
     * @param course 必要条件 ：课程教师id courseteacherid
     *               非必要条件：
     *               模糊查询 课程名 coursetitle
     *               课程类型查询  course
     *               <p>
     *               添加条件:
     *               课程状态 coursestate 三个查询条件；
     *               增加按（课程排序，课程评分，课程点击次数，评论次数）进行（asc/desc）排序的功能
     *               自定义 数据库中没有
     *               sort:排序 ,0=asc 1=desc
     *               SortBy:用什么排序 ,0=课程评分 coursescore ，1=课程点击次数 coursepullcount，2=评论次数 coursecommentcount。
     */
    Page<Course> selectCoursePageBy(Course course, Long pagenum, Long pagesize, String token);

    /**
     * 重写 2022-03-08 09:35:51
     * 机构课程列表
     *
     * @param course 必要条件 ：课程教师id courseteacherid
     *               非必要条件：
     *               模糊查询 课程名 coursetitle
     *               课程类型查询  course
     *               <p>
     *               添加条件:
     *               课程状态 coursestate 三个查询条件；
     *               增加按（课程排序，课程评分，课程点击次数，评论次数）进行（asc/desc）排序的功能
     *               自定义 数据库中没有
     *               sort:排序 ,0=asc 1=desc
     *               SortBy:用什么排序 ,0=课程评分 coursescore ，1=课程点击次数 coursepullcount，2=评论次数 coursecommentcount。
     */
    Page<Course> selectCoursePageBys(Course course, Long pagenum, Long pagesize, String token);


    /**
     * 系统
     *
     * @param course 非必要条件：
     *               模糊查询 课程名 coursetitle
     *               课程类型查询  course
     *               <p>
     *               添加条件:
     *               课程状态 -1--全部  0--未发布 1--发布 2--关闭；
     *               是否推荐 -1--全部 0--不推荐 1--推荐
     *               审核状态 -1--全部 0--未审 1--通过 2--未通过；
     *               <p>
     *               增加按（课程排序，课程评分，课程点击次数，评论次数）进行（asc/desc）排序的功能
     *               自定义 数据库中没有
     *               sort:排序 ,0=asc 1=desc
     *               SortBy:用什么排序 ,0=课程评分 coursescore ，1=课程点击次数 coursepullcount，2=评论次数 coursecommentcount。
     */
    Page<Course> selectSysCoursePageBy(Course course, Long pagenum, Long pagesize);

    /**
     * 创建课程
     * 默认：
     * 课程状态（coursestate）=0（未发布）
     * 课程审核状态(courseaudit)=0(未审核)
     * 课程创建时间（coursecreatetime）=当前时间
     * 最后更新时间(courseupdatetime)=当前时间
     * 课程评分（coursescore）= 5 （默认评分为5。评分范围【0-10】）
     * 课程点击次数（coursepullcount）= 0
     * 是否推荐（courserecommended）=0
     * 课程排序（coursesort）=500（默认排序都为500）
     * 评论次数（coursecommentcount）=0
     * 必传值：
     * 课程教师id（courseteacherid）// 22/1/20改为 String token
     * 必有值:
     * 登录用户的教师id
     * 课程教师姓名（courseteachername）= 登录用户的姓名
     * 课程所属机构id(courseorgid) = 如果教师属于某个机构，那么录入登录用户所属机构的id；如果是独立教师，那么此项为null
     *
     * @param course 课程信息
     * @param token  通过token在Redis拿到 用户信息
     * @return int
     */
    int insertCourse(Course course, String token);


    /**
     * 根据课程id 获取课程的总课时数量
     *
     * @param courseId
     * @return int
     */
    Integer selectCourseLessonNum(Integer courseId);

    /**
     * 查询出所有可用的的课程 临时后台管理用创建订单
     *
     * @return List<Course>
     */
    List<Course> selectCourseList();

    /**
     * 创建线下课程 Offlineshowattrconfig对象
     * 1、根据用户所在机构查询出机构的简称
     * 2、保存课程信息
     * 3、保存课程显示的信息
     * 默认：
     * 课程状态（coursestate）=0（未发布）
     * 课程审核状态(courseaudit)=0(未审核)
     * 课程创建时间（coursecreatetime）=当前时间
     * 最后更新时间(courseupdatetime)=当前时间
     * 课程评分（coursescore）= 5 （默认评分为5。评分范围【0-10】）
     * 课程点击次数（coursepullcount）= 0
     * 是否推荐（courserecommended）=0
     * 课程排序（coursesort）=500（默认排序都为500）
     * 评论次数（coursecommentcount）=0
     * 必传值：
     * 课程教师id（courseteacherid）// 22/1/20改为 String token
     * 必有值:
     * 登录用户的教师id
     * 课程教师姓名（courseteachername）= 登录用户的姓名
     * 课程所属机构id(courseorgid) = 如果教师属于某个机构，那么录入登录用户所属机构的id；如果是独立教师，那么此项为null
     *
     * @param courses 课程信息
     * @param token   通过token在Redis拿到 用户信息
     * @return int 没有token 返回-2
     */
    Integer insertCourses(CourseOfflineshowattrconfigDto courses, String token);

    /**
     * 修改线下课程使用数据
     * 如果该课程不存对应的显示控制，则进行创建一个显示控制
     *
     * @param courses 必要条件中的课程id（courseid、showconfigid）
     * @return int
     */
    int updateOfflineCourse(CourseOfflineshowattrconfigDto courses);

    /**
     * 根据 课程id(courseid) 查询线下课程数据
     *
     * @param courseId
     * @return CourseOfflineshowattrconfigDto
     */
    CourseOfflineDto selectOfflineCourseById(Integer courseId);
}
